package utils

import (
	"bytes"
	"encoding/json"
	"regexp"
	"unicode"
)

// ToJsonFormat 便于阅读的json
//
// 参数
//
//	-data: 泛型
//
// 返回
//
//	-string: 非紧凑型json
func ToJsonFormat(data any) string {
	if data == "" {
		return ""
	}

	// 检查是否是空字符串
	if s, ok := data.(string); ok && s == "" {
		return ""
	}

	marshal, err := json.MarshalIndent(data, "", "    ")
	if err != nil {
		return ""
	}

	str := string(marshal)
	// 检查是否是空对象
	if str == "{}" || str == "null" {
		return ""
	}

	return str
}

// ToJson 紧凑型json
//
// 参数
//
//	-data: 泛型
//
// 返回
//
//	-string: 紧凑型json
func ToJson(data any) string {
	if data == "" {
		return ""
	}

	marshal, err := json.Marshal(data)
	if err != nil {
		return ""
	}
	return string(marshal)
}

// ForcedToJsonFormat 强制json格式化输出
//
// 参数
//
//	-b: 字节
//
// 返回
//
//	-string: json字符串
//
//goland:noinspection GoUnhandledErrorResult,GoUnusedExportedFunction
func ForcedToJsonFormat(b []byte) string {
	// 1. 检查输入是否为空
	if len(b) == 0 {
		return ""
	}

	// 2. 检查是否是有效的JSON（可选）
	if !json.Valid(b) {
		return string(b) // 返回原始字符串或处理错误的其他方式
	}
	var result any
	// 将JSON字符串解码到result变量中
	err := json.Unmarshal(b, &result)
	if err != nil {
		return string(b)
	}

	// 格式化输出JSON字符串
	formattedJson, err := json.MarshalIndent(result, "", "  ")
	if err != nil {
		return string(b)
	}
	return string(formattedJson)
}

// IsAllEnglish 是否都是英文
//
// 参数
//   - s: 字符串
//
// 返回
//
//	-bool: 是/否
//
//goland:noinspection GoUnhandledErrorResult,GoUnusedExportedFunction
func IsAllEnglish(s string) bool {
	reg, err := regexp.Compile("^[A-Za-z]+$")
	if err != nil {
		panic(err) // 处理正则表达式编译错误
	}
	return reg.MatchString(s)
}

// IsAllEnglishIgnoreSymbols 是否都是英文(忽略符号及其他的)
//
// 参数
//   - s: 字符串
//
// 返回
//
//	-bool: 是/否
//
//goland:noinspection GoUnhandledErrorResult,GoUnusedExportedFunction
func IsAllEnglishIgnoreSymbols(s string) bool {
	// Remove all symbols and numbers
	re := regexp.MustCompile("[^A-Za-z]+")
	// Replace all non-letter characters with an empty string
	cleanedString := re.ReplaceAllString(s, "")

	// Check if the cleaned string contains only English letters
	return len(cleanedString) > 0 && regexp.MustCompile("^[A-Za-z]+$").MatchString(cleanedString)
}

// PascalCaseToCamel 将首字母大写首字母大写的驼峰命名转换首字母小写的驼峰命名
func PascalCaseToCamel(s string) string {
	if s == "" || len(s) == 0 {
		return s
	}

	runes := []rune(s)
	runes[0] = unicode.ToLower(runes[0])
	return string(runes)
}

// CamelToSnakeCase 将驼峰转下划线方式
func CamelToSnakeCase(s string) string {
	var buffer bytes.Buffer
	for i, r := range s {
		if unicode.IsUpper(r) {
			if i > 0 {
				buffer.WriteRune('_')
			}
			buffer.WriteRune(unicode.ToLower(r))
		} else {
			buffer.WriteRune(r)
		}
	}
	return buffer.String()
}